package com.dao;
import java.util.List;
import java.util.Set;
import com.hbt.HibernateUtil;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.bean.Cliente;

public class ClienteDAO {
	
	private static ClienteDAO instancia = null;
	private static SessionFactory sf = null;

	
	public static ClienteDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new ClienteDAO();
		} 
		return instancia;
	}
	
	
	public void grabarClientes (Set <Cliente> clientes){
		Session session = sf.openSession();
		session.beginTransaction();
		for (Cliente c : clientes){
			session.save(c);
		}
		session.getTransaction().commit();
		session.close();
	}
	
	
	public void grabarCliente (Cliente cliente){
		Session session = sf.openSession();
		session.beginTransaction();
		session.save(cliente);
		session.getTransaction().commit();
		session.close();
	}
	
	
	public void bajaCliente (Integer idCliente){
		
			Session session = null;
		
		try{
			session = sf.openSession();	
			session.beginTransaction();
			//session.createQuery("DELETE Cliente c WHERE c.id = :var").setInteger("var", idCliente).executeUpdate();
			Cliente cliente = (Cliente) session.get(Cliente.class, idCliente);
			session.delete(cliente);
			//session.flush();
			session.getTransaction().commit();
			session.close();
		}catch (HibernateException e) {
			System.out.println("Cliente en uso. Imposible borrar.");
			if (session != null)
				session.close();
		}
	}

	
	public Cliente getCliente(Cliente cli) {
		Session session = sf.openSession();
		Cliente cliente = (Cliente) session.get(Cliente.class, cli.getId());
		session.close();
		return cliente;
	}
	
	public Cliente getCliente(String nombre) {
		Session session = sf.openSession();
		Cliente cliente = (Cliente) session.createQuery("from Cliente c where c.nombre = :var")
		.setString("var", nombre).setFirstResult(0).setMaxResults(1).uniqueResult();
		session.close();
		return cliente;
	}

	
	public List<Cliente> getClientes(){
		Session session = sf.openSession();
		List<Cliente> result = (List<Cliente>) session.createQuery("from Cliente").list();
		session.close();
		return result;	
	}
	
	
	public void actualizarCliente(Cliente cliente) {
		try{
			
			Session session = sf.openSession();
			session.beginTransaction();
			session.update(cliente);
			session.getTransaction().commit();
			session.close();	
			
		}catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
}